Použití DynamicModule pro tvorbu uživatelské aplikace v prostředí notebooku

Filip Novotný
KFE FJFI ČVUT
filip.novotny@fjfi.cvut.cz

Initialization

solarIrradianceSpectrum=({{FEStringssizeExplanation}, {{{280.`,2.5361`*^-26},{280.5`,1.0917`*^-24},{281.`,6.1253`*^-24},{281.5`,2.7479`*^-22},{282.`,2.8346`*^-21},{282.5`,1.3271`*^-20},{283.`,6.7646`*^-20},«1988»,{3970.`,0.0076997`},{3975.`,0.007528`},{3980.`,0.0074049`},{3985.`,0.0074503`},{3990.`,0.0073894`},{3995.`,0.0072263`},{4000.`,0.0071199`}}}, {FEStringssizeShowLess FEStringssizeShowMore FEStringssizeShowAll FEStringssizeChangeLimit}});

zoomInIcon=;
zoomOutIcon=Import["C:\\Users\\Filip\\Documents\\!!Konference\\MathematikaELKAN2012\\icons\\zoomOut.png",ImageSize->24]
pointerIcon= Import["C:\\Users\\Filip\\Documents\\!!Konference\\MathematikaELKAN2012\\icons\\pointer.png",ImageSize->15]

plotStyle={
Frame->True
,InterpolationOrder->3
(*,ImageSize->Full*)
,FrameLabel->{"λ [nm]","Intensity"}
,PlotLabel->"Solar Irradiance Spectrum"
};

Plot with Zoom Selection Box

Selection box pro “zoomování” ve vyneseném grafu se zachováním os. Zde vytvořeno použitím funkce EventHandler[], jež umožňuje detekovat a spouštět příkazy, jestliže nastane definovaná událost - v tomto případě pohyb či stísknutí/uvolnění tlačítka myši.

Celá funkčnost je tvořena za pomocí DynamicModule, který lokalizuje definované proměnné (např. plotRange). SetterBar[] umožňuje zapnutí/vypnutí fukce selection boxu (přes proměnou selectionMode), Button[] zoomOut zajištuje možnost zpětného vyresetování PlotRange na Full.

Při selectionMode==True pak EventHandler sleduje stisknutí myši a pomocí MousePosition[“Graphics”] vykresluje selekční obdélník. Po uvolnění tlačítka myši pak updatuje proměnou plotRange, což způsobí změnu intervalů vykreslovaných hodnot příkazem ListLinePlot[].

DynamicModule[
{
plotRange=All
,rangeTemp={}
,selectionBox={}
,selectionMode=True
},
Column[{

Row[{
SetterBar[Dynamic[selectionMode],{False->pointerIcon,True->zoomInIcon}]
,Button[zoomOutIcon,plotRange=All]
}],

Dynamic[
EventHandler[
Show[
ListLinePlot[
solarIrradianceSpectrum
,plotStyle
,PlotRange->plotRange
]
,selectionBox
],

If[selectionMode,
{{"MouseDown":>(
rangeTemp=MousePosition["Graphics"];
selectionBox=Graphics[
{EdgeForm[Directive[Thin,Dashed]],Transparent,Rectangle[rangeTemp,Dynamic[MousePosition["Graphics"]]]}
];
)},

{"MouseUp":>(
plotRange=Transpose[{rangeTemp,MousePosition["Graphics"]}];
selectionBox={}
)}}
]
]]
},Frame->True]
]

Auto-Resizing App-like window

Vytvoření notebooku, který se bude chovat podobně jak standartní aplikace ve smyslu automatického přeškálování obsahu na velikost okna. Využití dynamického updatování velikosti obsahu (zde ImageSize) pomocí parametru notebooku Dynamic[CurrentValue[WindowSize]].

CreateDocument[
DynamicModule[
{
plotRange=All
,rangeTemp={}
,selectionBox={}
,selectionMode=True
},
Column[{

Row[{
SetterBar[Dynamic[selectionMode],{False->pointerIcon,True->zoomInIcon}]
,Button[zoomOutIcon,plotRange=All]
}],

Dynamic[
EventHandler[
Show[
ListLinePlot[
solarIrradianceSpectrum
,plotStyle
(*Zde vlozim dynamicky updatovany parametr CurrentValue[WindowSize] - tim se dosahne skalovani obsahu podle velikosti notebooku*)
,ImageSize->Dynamic[CurrentValue[WindowSize]-{20,40}]
,PlotRange->plotRange
]
,selectionBox
],

If[selectionMode,
{{"MouseDown":>(
rangeTemp=MousePosition["Graphics"];
selectionBox=Graphics[
{EdgeForm[Directive[Thin,Dashed]],Transparent,Rectangle[rangeTemp,Dynamic[MousePosition["Graphics"]]]}
];
)},

{"MouseUp":>(
plotRange=Transpose[{rangeTemp,MousePosition["Graphics"]}];
selectionBox={}
)}}
]
]]
},Frame->False]
]
,WindowSize->{800,600}
,WindowFrame->"Normal"
,WindowElements->{}
,WindowTitle->"Solar Irradiance Spectrum"
,CellFrame->False
,CellMargins->0
,CellFrameMargins->0]